package com.aasa.siccosap.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import oracle.jdbc.OracleCallableStatement;
//import oracle.jdbc.driver.OracleTypes;
import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
import java.sql.Struct;

import javax.sql.DataSource;
import org.apache.log4j.Logger;


import com.aasa.siccosap.bean.ClienteBean;
import com.aasa.siccosap.bean.ObraBean;
import com.aasa.siccosap.bean.ObraDetalle;
import com.aasa.siccosap.bean.ObraDetalleResultado;
import com.aasa.siccosap.bean.ParametrosActualizacionObras;
import com.aasa.siccosap.bean.ParametrosConsultaObra;
import com.aasa.siccosap.bean.ParametrosGenerales;
import com.aasa.siccosap.util.Constantes;

public class ObraDAO extends ConsultaClienteBaseDAO {

	static Logger logger = Logger.getLogger("ObraDAO.class");
	public ObraDAO()	throws accesoDaoException {
		super();
	}
	
	public ObraDAO(DataSource dataSource) {
		super(dataSource);
	}
	

	public List<ObraBean> consultarObras(ParametrosGenerales objA_parametros) throws Exception{
        ResultSet objL_rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_CONS_OBRAS_BLOQUEO(?,?,?,?,?,?); end;";
        List<ObraBean> aObjL_consultaBloqueosObra=new ArrayList<ObraBean>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                configuraParametrosConsultaObras(objA_parametros);
                this.stmt.execute();
                this.av_message = (String)stmt.getObject(1);
                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                	objL_rs = (ResultSet)stmt.getObject(2);
                           while(objL_rs.next()){
                                ObraBean objL_detalleObra = creaRegistroConsultaObras(objL_rs);
                                aObjL_consultaBloqueosObra.add(objL_detalleObra);
                        }
                }else{
                    return null;
                }
                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		
        	close(this.conn, objL_rs, stmt);
        }
        return(aObjL_consultaBloqueosObra);
        /*ObraBean detalleObra=new ObraBean();
        detalleObra.setStrPb_codCli("181413");
        detalleObra.setStrPb_numObra("671");
        detalleObra.setStrPb_descObra("prueba ingresada");
        detalleObra.setObjPb_fecCreacion(new Date());
        detalleObra.setDblPb_montoLimiteDolares(500.00);
        detalleObra.setStrPb_flgBloqueo("SI");
        detalleObra.setStrPb_flgBloqueoLimite("SI");
        detalleObra.setDblPb_totalFacturado(6757.98);
        detalleObra.setDblPb_totalSaldo(837837.09);
        detalleObra.setDblPb_totalFabricacion(8788.52);
        detalleObra.setDblPb_totalFactDiferidas(487.10);
        detalleObra.setDblPb_totalNc(784.12);
        detalleObra.setDblPb_totalPedidoNc(784.10);
        detalleObra.setDblPb_totalDisenio(545.89);
        detalleObra.setDblPb_totalFinal(45.15);
        aObjL_consultaBloqueosObra.add(detalleObra);
        return (aObjL_consultaBloqueosObra);*/
        
	}
	
	
    private CallableStatement configuraParametrosConsultaObras(ParametrosGenerales objA_parametros)
    throws SQLException{
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
        stmt.registerOutParameter(2, OracleTypes.CURSOR);
        stmt.setString(3, objA_parametros.getStrPb_codigoCliente());
        java.sql.Date objL_fechaInicioSQL = new java.sql.Date(objA_parametros.getObjPb_fechaInicio() .getTime());
        java.sql.Date objL_fechaFinSQL = new java.sql.Date(objA_parametros.getObjPb_fechaFin().getTime());
        stmt.setDate(4,objL_fechaInicioSQL);	       
        stmt.setDate(5,objL_fechaFinSQL);
        stmt.setString(6, objA_parametros.getStrPb_numero_obra());
        return(stmt);          
    }
	
    
    private ObraBean creaRegistroConsultaObras(ResultSet objA_rs) throws SQLException {
        ObraBean objL_obraBean = new ObraBean();
        objL_obraBean.setStrPb_codCli(objA_rs.getString("COD_CLI"));
        objL_obraBean.setStrPb_numObra(objA_rs.getString("NUM_OBRA"));
        objL_obraBean.setStrPb_descObra(objA_rs.getString("DESC_OBRA"));
        objL_obraBean.setObjPb_fecCreacion(objA_rs.getDate("FEC_CREACION"));
        String strL_monto = objA_rs.getString("MONTO_LIMITE_DOLARES");
        if(strL_monto!=null)
        	objL_obraBean.setDblPb_montoLimiteDolares(rs.getDouble("MONTO_LIMITE_DOLARES"));
        else
        objL_obraBean.setDblPb_montoLimiteDolares(null);
        objL_obraBean.setStrPb_flgBloqueo(objA_rs.getString("FLG_BLOQUEO"));
        objL_obraBean.setStrPb_flgBloqueoLimite(objA_rs.getString("FLG_BLOQUEO_LIMITE"));
        objL_obraBean.setDblPb_totalFacturado(objA_rs.getDouble("TOTAL_FACTURADO"));
        objL_obraBean.setDblPb_totalSaldo(objA_rs.getDouble("TOTAL_SALDO"));
        objL_obraBean.setDblPb_totalFabricacion(objA_rs.getDouble("TOTAL_FABRICACION"));
        objL_obraBean.setDblPb_totalFactDiferidas(objA_rs.getDouble("FACTFINAN"));
        objL_obraBean.setDblPb_totalNc(objA_rs.getDouble("TOTALNC"));
        objL_obraBean.setDblPb_totalPedidoNc(objA_rs.getDouble("TOTALPEDIDONC"));
        objL_obraBean.setDblPb_totalDisenio(objA_rs.getDouble("TOTAL_DISENIO"));
        objL_obraBean.setDblPb_totalFinal(objA_rs.getDouble("TOTAL_FINAL"));
        return objL_obraBean;
    }
	
	public String actualizarObras(ParametrosActualizacionObras objA_parametros) throws Exception{
		ResultSet objL_rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_GUARDAR_OBRA(?,?,?,?,?,?,?,?,?,?,?,?,?,?); end;";
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                configuraParametrosActualizacionObras(objA_parametros);
                this.stmt.execute();
                this.av_message = (String)stmt.getObject(1);
                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                	
                }else{
                    return null;
                }
                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, objL_rs, stmt);
        }
        return (this.av_message);
    }
    
    
    private CallableStatement configuraParametrosActualizacionObras(ParametrosActualizacionObras objA_parametros)
    throws SQLException{
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
    	stmt.setString(2,objA_parametros.getStrPb_codCliente());
    	stmt.setString(3,objA_parametros.getStrPb_numObra());
    	stmt.setString(4,objA_parametros.getStrPb_flgBloqueo());
    	stmt.setString(5,objA_parametros.getStrPb_flgBloqueoLimite());
    	if(objA_parametros.getDblPb_montoLimiteDolares()!=null){
    		stmt.setDouble(6,objA_parametros.getDblPb_montoLimiteDolares());
    	}else{
    		stmt.setNull(6, OracleTypes.DOUBLE);// java.sql.Types.DOUBLE);
    	}
        java.sql.Date fechaInicioSQL = new java.sql.Date(objA_parametros.getObjPb_fecIni().getTime());
        java.sql.Date fechaFinSQL = new java.sql.Date(objA_parametros.getObjPb_fecFin().getTime());
        stmt.setDate(7,fechaInicioSQL);	       
        stmt.setDate(8,fechaFinSQL);
    	stmt.setString(9,objA_parametros.getStrPb_usuario());
    	stmt.setDouble(10, objA_parametros.getDblPb_totalFactura());
    	stmt.setDouble(11, objA_parametros.getDblPb_totalSaldo());
    	stmt.setDouble(12, objA_parametros.getDblPb_totalFabricacion());
    	stmt.setDouble(13, objA_parametros.getDblPb_totalDisenio());
    	stmt.setString(14, objA_parametros.getStrPb_motivoBloqueo());
        return(stmt);         
    }
	
	
    public List<ObraBean> listadoObras(ParametrosGenerales parametros) throws Exception{
        ResultSet objL_rs = null;
        this.av_message = null;
        this.storedProcedure = "begin CONSULTA_ACEDIM_PKG.P_LISTADO_OBRAS(?,?,?,?,?); end;";
        List<ObraBean> aobjL_listadoObras=new ArrayList<ObraBean>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                configuraParametrosConsultaClienteGenerales(parametros);
                this.stmt.execute();
                this.av_message = (String)stmt.getObject(1);
                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                	objL_rs = (ResultSet)stmt.getObject(2);
                        while(objL_rs.next()){
                                ObraBean objL_detalleObra = creaRegistroListadoObras(objL_rs);
                                aobjL_listadoObras.add(objL_detalleObra);
                        }
                }else{
                    return null;
                }
                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, objL_rs, stmt);
        }
        return(aobjL_listadoObras);
    }
	           
    private ObraBean creaRegistroListadoObras(ResultSet objA_rs) throws SQLException {
        ObraBean objL_obraBean = new ObraBean();
        objL_obraBean.setStrPb_codCli(objA_rs.getString("COD_CLI"));
        objL_obraBean.setStrPb_numObra(objA_rs.getString("NUM_OBRA"));
        objL_obraBean.setStrPb_descObra(objA_rs.getString("DESC_OBRA"));
        return objL_obraBean;
    }
    
    public ObraDetalleResultado listadoObrasDetalle(ParametrosConsultaObra objA_parametros) throws Exception{
        ResultSet objL_rsResFacturas = null;
        ResultSet objL_rsResNotaCredito = null;
        ResultSet objL_rsResPendEmision = null;
        ResultSet objL_rsResPedidos = null;
        ResultSet objL_rsResFacFinanciera = null;
        
        this.av_message = null;
        this.storedProcedure = "begin PROCESOS_ACEDIM_PKG.P_CONSULTA_DETALLE_OBRA(?,?,?,?,?,?,?,?,?,?,?,?,?); end;";
        ObraDetalleResultado objL_listadoObrasDetalle = new ObraDetalleResultado();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                configuraParametrosConsultaObrasDetalle(objA_parametros);
                this.stmt.execute();
                this.av_message = (String)stmt.getObject(1);
                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){

	                	//CARGAMOS LA LISTA PL_RESULTADO_FACTURAS	
                	    objL_rsResFacturas = (ResultSet)stmt.getObject(2);
                        List<ObraDetalle> listadoResFacturas = new ArrayList<ObraDetalle>();
                        while(objL_rsResFacturas.next()){
                        		ObraDetalle objL_detalleResFacturas = new ObraDetalle(); 
                        		objL_detalleResFacturas.setStrPb_numDespacho(objL_rsResFacturas.getString("NUM_DESPACHO"));
                        		objL_detalleResFacturas.setStrPb_pedido(objL_rsResFacturas.getString("SEC_PED"));
                        		objL_detalleResFacturas.setStrPb_tipoDoc(objL_rsResFacturas.getString("TIPO_DOC"));
                        		objL_detalleResFacturas.setStrPb_serieManual(objL_rsResFacturas.getString("SERIE_MANUAL"));
                        		objL_detalleResFacturas.setStrPb_numeroManual(objL_rsResFacturas.getString("NUMERO_MANUAL"));
                        		objL_detalleResFacturas.setObjPb_fecEmi(objL_rsResFacturas.getDate("FEC_EMI"));
                        		objL_detalleResFacturas.setObjPb_fecVenc(objL_rsResFacturas.getDate("FEC_VEN"));
                        		objL_detalleResFacturas.setDblPb_impTotDoc(objL_rsResFacturas.getDouble("IMP_TOT_DOC"));
                                listadoResFacturas.add(objL_detalleResFacturas);
                        }
                        objL_listadoObrasDetalle.setLstDatosFacturas(listadoResFacturas);
                        objL_listadoObrasDetalle.setDblPb_totalFacturas(stmt.getDouble(7));
                        
                        
	                	//CARGAMOS LA LISTA PL_RESULTADO_NOTAS_CREDITO	
                        objL_rsResNotaCredito = (ResultSet)stmt.getObject(3);
                        List<ObraDetalle> listadoResNotasCredito = new ArrayList<ObraDetalle>();
                        while(objL_rsResNotaCredito.next()){
                        		ObraDetalle objL_detalleResNotasCredito = new ObraDetalle(); 
                        		objL_detalleResNotasCredito.setStrPb_numDespacho(objL_rsResNotaCredito.getString("NUM_DESPACHO"));
                        		objL_detalleResNotasCredito.setStrPb_pedido(objL_rsResNotaCredito.getString("SEC_PED"));
                        		objL_detalleResNotasCredito.setStrPb_tipoDoc(objL_rsResNotaCredito.getString("TIPO_DOC"));
                        		objL_detalleResNotasCredito.setStrPb_serieManual(objL_rsResNotaCredito.getString("SERIE_MANUAL"));
                        		objL_detalleResNotasCredito.setStrPb_numeroManual(objL_rsResNotaCredito.getString("NUMERO_MANUAL"));
                        		objL_detalleResNotasCredito.setObjPb_fecEmi(objL_rsResNotaCredito.getDate("FEC_EMI"));
                        		objL_detalleResNotasCredito.setObjPb_fecVenc(objL_rsResNotaCredito.getDate("FEC_VEN"));
                        		objL_detalleResNotasCredito.setDblPb_impTotDoc(objL_rsResNotaCredito.getDouble("IMP_TOT_DOC"));
                        		listadoResNotasCredito.add(objL_detalleResNotasCredito);
                        }
                        objL_listadoObrasDetalle.setLstNotasCredito(listadoResNotasCredito);
                        objL_listadoObrasDetalle.setDblPb_totalNotasCredito(stmt.getDouble(8));
                        
                        
	                	//CARGAMOS LA LISTA PL_RESULTADO_PEND_EMISION	
                        objL_rsResPendEmision = (ResultSet)stmt.getObject(4);
                        List<ObraDetalle> listadoResPendEmision = new ArrayList<ObraDetalle>();
                        Double dblL_totalTemp = new Double(0); 
                        while(objL_rsResPendEmision.next()){
                        		ObraDetalle objL_detalleResPendEmision = new ObraDetalle(); 
                        		objL_detalleResPendEmision.setStrPb_numDespacho(objL_rsResPendEmision.getString("NUM_DESPACHO"));
                        		objL_detalleResPendEmision.setStrPb_pedido(objL_rsResPendEmision.getString("PEDIDO"));
                        		objL_detalleResPendEmision.setStrPb_descriEstado(objL_rsResPendEmision.getString("DESCRI_ESTADO"));
                        		objL_detalleResPendEmision.setDblPb_tonelaje(objL_rsResPendEmision.getDouble("PESO_TOTAL_TN"));
                        		//calculamos el total de dolares
                        		dblL_totalTemp = objL_rsResPendEmision.getDouble("VALORDOLARES")+objL_rsResPendEmision.getDouble("VALORSOLES")/objL_rsResPendEmision.getDouble("TIPO_CAMBIO");
                        		objL_detalleResPendEmision.setDblPb_totalDolares(dblL_totalTemp);
                        		objL_detalleResPendEmision.setDblPb_tipoCambio(objL_rsResPendEmision.getDouble("TIPO_CAMBIO"));
                        		objL_detalleResPendEmision.setDblPb_valorSoles(objL_rsResPendEmision.getDouble("VALORSOLES"));
                        		objL_detalleResPendEmision.setDblPb_valorDolares(objL_rsResPendEmision.getDouble("VALORDOLARES"));
                        		listadoResPendEmision.add(objL_detalleResPendEmision);
                        }
                        objL_listadoObrasDetalle.setLstNotasCreditoPendiente(listadoResPendEmision);
                        objL_listadoObrasDetalle.setDblPb_totalNotasCreditoPendiente(stmt.getDouble(9));
                        
                        
	                	//CARGAMOS LA LISTA PL_RESULTADO_PEDIDOS	
                        objL_rsResPedidos = (ResultSet)stmt.getObject(5);
                        List<ObraDetalle> listadoResPedidos = new ArrayList<ObraDetalle>();
                        Double dblL_totalTempResPedidos = new Double(0); 
                        while(objL_rsResPedidos.next()){
                        		ObraDetalle objL_detalleResPedidos = new ObraDetalle(); 
                        		objL_detalleResPedidos.setStrPb_numDespacho(objL_rsResPedidos.getString("NUM_DESPACHO"));
                        		objL_detalleResPedidos.setStrPb_pedido(objL_rsResPedidos.getString("PEDIDO"));
                        		objL_detalleResPedidos.setStrPb_descriEstado(objL_rsResPedidos.getString("DESCRI_ESTADO"));
                        		objL_detalleResPedidos.setDblPb_tonelaje(objL_rsResPedidos.getDouble("PESO_TOTAL_TN"));
                        		// calculamos el total 
                        		dblL_totalTempResPedidos = objL_rsResPedidos.getDouble("VALORDOLARES")+objL_rsResPedidos.getDouble("VALORSOLES")/objL_rsResPedidos.getDouble("TIPO_CAMBIO");
                        		objL_detalleResPedidos.setDblPb_totalDolares(dblL_totalTempResPedidos);
                        		objL_detalleResPedidos.setDblPb_tipoCambio(objL_rsResPedidos.getDouble("TIPO_CAMBIO"));
                        		objL_detalleResPedidos.setDblPb_valorSoles(objL_rsResPedidos.getDouble("VALORSOLES"));
                        		objL_detalleResPedidos.setDblPb_valorDolares(objL_rsResPedidos.getDouble("VALORDOLARES"));
                        		listadoResPedidos.add(objL_detalleResPedidos);
                        }       
                        objL_listadoObrasDetalle.setLstDatosPedidos(listadoResPedidos);
                        objL_listadoObrasDetalle.setDblPb_totalPedidos(stmt.getDouble(10));
                        

	                	//CARGAMOS LA LISTA PL_RESULTADO_FAC_FINANCIERA	
                        objL_rsResFacFinanciera = (ResultSet)stmt.getObject(6);
                        List<ObraDetalle> listadoResFacFinanciera = new ArrayList<ObraDetalle>();
                        Double dblL_totalTempResFacFinanciera = new Double(0);
                        while(objL_rsResFacFinanciera.next()){
                        		ObraDetalle detalleResFacFinanciera = new ObraDetalle(); 
                        		detalleResFacFinanciera.setStrPb_numDespacho(objL_rsResFacFinanciera.getString("NUM_DESPACHO"));
                        		detalleResFacFinanciera.setStrPb_pedido(objL_rsResFacFinanciera.getString("PEDIDO"));
                        		detalleResFacFinanciera.setStrPb_descriEstado(objL_rsResFacFinanciera.getString("DESCRI_ESTADO"));
                        		detalleResFacFinanciera.setDblPb_tonelaje(objL_rsResFacFinanciera.getDouble("PESO_TOTAL_TN"));
                        		dblL_totalTempResFacFinanciera = objL_rsResFacFinanciera.getDouble("VALORDOLARES")+objL_rsResFacFinanciera.getDouble("VALORSOLES")/objL_rsResFacFinanciera.getDouble("TIPO_CAMBIO");
                        		detalleResFacFinanciera.setDblPb_totalDolares(dblL_totalTempResFacFinanciera);
                        		detalleResFacFinanciera.setDblPb_tipoCambio(objL_rsResFacFinanciera.getDouble("TIPO_CAMBIO"));
                        		detalleResFacFinanciera.setDblPb_valorSoles(objL_rsResFacFinanciera.getDouble("VALORSOLES"));
                        		detalleResFacFinanciera.setDblPb_valorDolares(objL_rsResFacFinanciera.getDouble("VALORDOLARES"));
                        		listadoResFacFinanciera.add(detalleResFacFinanciera);
                        }        
                        objL_listadoObrasDetalle.setLstFacturasFinancieras(listadoResFacFinanciera);
                        objL_listadoObrasDetalle.setDblPb_totalFacturasFinancieras(stmt.getDouble(11));
                        
                }else{
                    return null;
                }
                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		
        		try {
    				if (objL_rsResFacturas != null)	objL_rsResFacturas.close();	
    			} catch (SQLException sqlex) {	System.err.println(sqlex.getMessage());		}

    			try {
    				if (objL_rsResNotaCredito != null)	objL_rsResNotaCredito.close();	
    			} catch (SQLException sqlex) {	System.err.println(sqlex.getMessage());		}

    			try {
    				if (objL_rsResPendEmision != null)	objL_rsResPendEmision.close();	
    			} catch (SQLException sqlex) {	System.err.println(sqlex.getMessage());		}

    			try {
    				if (objL_rsResPedidos != null)	objL_rsResPedidos.close();	
    			} catch (SQLException sqlex) {	System.err.println(sqlex.getMessage());		}

    			try {
    				if (objL_rsResFacFinanciera != null)	objL_rsResFacFinanciera.close();	
    			} catch (SQLException sqlex) {	System.err.println(sqlex.getMessage());		}
    			
        		close(this.conn, objL_rsResFacFinanciera, stmt);
        		
        }
        return(objL_listadoObrasDetalle);
    }
    
    
    private CallableStatement configuraParametrosConsultaObrasDetalle(ParametrosConsultaObra parametros)
    throws SQLException{
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);
    	stmt.registerOutParameter(2, OracleTypes.CURSOR);
    	stmt.registerOutParameter(3, OracleTypes.CURSOR);
    	stmt.registerOutParameter(4, OracleTypes.CURSOR);
    	stmt.registerOutParameter(5, OracleTypes.CURSOR);
    	stmt.registerOutParameter(6, OracleTypes.CURSOR);
    	stmt.registerOutParameter(7, OracleTypes.NUMBER);
    	stmt.registerOutParameter(8, OracleTypes.NUMBER);
    	stmt.registerOutParameter(9, OracleTypes.NUMBER);
    	stmt.registerOutParameter(10, OracleTypes.NUMBER);
    	stmt.registerOutParameter(11, OracleTypes.NUMBER);
    	stmt.setString(12,parametros.getStrPb_codigoCliente());
    	stmt.setString(13, parametros.getStrPb_numeroObra());
        return(stmt);         
    }
    
    public String enviarCorreoBloqueoObras(String strA_codigoCliente, String strA_tipo) throws Exception{
		ResultSet rs = null;
        this.av_message = null;
        if(strA_tipo.trim().equals("B")){
        	this.storedProcedure = "begin PROCESOS_ACEDIM_PKG.P_EMAIL_BLOQUEO_OBRA_ACEDIM(?); end;";
        }else if(strA_tipo.trim().equals("D")){
        	this.storedProcedure = "begin PROCESOS_ACEDIM_PKG.P_EMAIL_DESBLOQUEO_OBRA_ACEDIM(?); end;";
        }
        
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
            	stmt.setString(1,strA_codigoCliente);
                this.stmt.execute();
                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, rs, stmt);
        }
        return (this.av_message);
    }

	public List<ObraBean> consultarObrasTodas(ParametrosConsultaObra objA_parametros) throws Exception{
		 ResultSet objL_rs = null;
	        this.av_message = null;
	        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_LISTA_OBRAS(?,?,?,?,?); end;";
	        List<ObraBean> aobjL_listadoObras=new ArrayList<ObraBean>();
	        try{
	                this.conn = dataSource.getConnection();
	                this.stmt = this.conn.prepareCall(storedProcedure);
	                configuraParametrosConsultaClienteGenerales(objA_parametros);
	                this.stmt.execute();
	                this.av_message = (String)stmt.getObject(1);
	                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
	                	objL_rs = (ResultSet)stmt.getObject(2);
	                        while(objL_rs.next()){
	                                ObraBean objL_obraBean = creaRegistroListadoObras(objL_rs);
	                                aobjL_listadoObras.add(objL_obraBean);
	                        }
	                }else{
	                    return null;
	                }
	                
	        }catch (Exception e){
	                e.printStackTrace();
	                return null;
	        }finally{
	        		close(this.conn, objL_rs, stmt);
	        }
	        return(aobjL_listadoObras);
	}

	public ObraBean consultaNombreObra(String strA_nroObra, String strA_codCli) throws Exception {
		
		av_message = null;
        storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_OBTEN_OBRA(?,?,?,?); end;";
        
        ObraBean objL_obraBean = null;
        String strL_nombre = null;
       
        try{
                conn = dataSource.getConnection();
                stmt = conn.prepareCall(storedProcedure);
                              
                stmt.registerOutParameter(1, OracleTypes.VARCHAR);
        		stmt.setString(2, strA_nroObra);
        		stmt.setString(3, strA_codCli);
        		stmt.registerOutParameter(4, OracleTypes.VARCHAR);
                
                stmt.execute();

                av_message = (String)stmt.getObject(1);
                	
                if(av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){                	
                	strL_nombre = (String)stmt.getObject(4);   
                    
                    objL_obraBean = new ObraBean();
                    objL_obraBean.setStrPb_descObra(strL_nombre);
                    
                }else{
                    return null;
                }

        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(conn, null, stmt);
        }
		
		return objL_obraBean;
		
	}

	public ArrayList<ObraBean> consultarObras(String strA_codigoCliente, String strA_nroObra,
			String strA_nombreObra)throws Exception {
		av_message = null;
        storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_BUSCAR_OBRAS(?,?,?,?,?); end;";
        
        ArrayList<ObraBean> aobjL_listaObras = new ArrayList<ObraBean>();
        
        try {
        	
        	    conn = dataSource.getConnection();
                stmt = conn.prepareCall(storedProcedure);
                            
                stmt.registerOutParameter(1, OracleTypes.CURSOR);
      			stmt.setString(2, strA_codigoCliente);
      			stmt.setString(3, strA_nroObra);
      			stmt.setString(4, strA_nombreObra);
      		    stmt.registerOutParameter(5, OracleTypes.VARCHAR);
              
                stmt.execute();
                this.av_message = (String)stmt.getObject(5);
                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        rs = (ResultSet)stmt.getObject(1);
                        while(rs.next()){
                               
                        	ObraBean objL_obraBean = new ObraBean();
                        	objL_obraBean.setStrPb_codCli(rs.getString("cod_cli"));
                        	objL_obraBean.setStrPb_numObra(rs.getString("num_obra"));
                        	objL_obraBean.setStrPb_descObra(rs.getString("desc_obra"));                        	
                        	aobjL_listaObras.add(objL_obraBean);
                        }
                }else{
                    return null;
                }
        	
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
        		close(conn, null, stmt);
        }
		return aobjL_listaObras;
	}

	public ArrayList<ObraBean> consultarBloqueosObra(ParametrosGenerales param) throws Exception {
		ResultSet objL_rs=null;
		av_message = null;
        storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_BUSCAR_BLOQUEOS(?,?,?,?,?,?); end;";
		
		 ArrayList<ObraBean> aobjL_listaObras = new ArrayList<ObraBean>();
	        
	        try {
	        	SimpleDateFormat objL_sdf= new SimpleDateFormat("dd-MM-yyyy HH_MM"); 
	        	
	        	    conn = dataSource.getConnection();
	                stmt = conn.prepareCall(storedProcedure);
	                            
	                stmt.registerOutParameter(1, OracleTypes.CURSOR);
	      			stmt.setString(2, param.getStrPb_codigoCliente());
	      			stmt.setString(3, param.getStrPb_numero_obra());
	      			
	      			
	      		  if ((param.getObjPb_fechaInicio() != null) && (param.getObjPb_fechaFin() != null)){
	      	        java.sql.Date fechaInicioSQL = new java.sql.Date(param.getObjPb_fechaInicio().getTime());
	      	        java.sql.Date fechaFinSQL = new java.sql.Date(param.getObjPb_fechaFin().getTime());
	      	        System.out.println(fechaInicioSQL);
	      	        System.out.println(fechaFinSQL);
	      	        stmt.setDate(4,fechaInicioSQL);	       
	      	        stmt.setDate(5,fechaFinSQL);
	              }      			
	      			
	      		    stmt.registerOutParameter(6, OracleTypes.VARCHAR);
	              
	                stmt.execute();
	                this.av_message = (String)stmt.getObject(6);
	                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
	                	objL_rs = (ResultSet)stmt.getObject(1);
	                        while(objL_rs.next()){
	                               
	                        	ObraBean objL_obraBean = new ObraBean();
	                        	objL_obraBean.setStrPb_codCli(objL_rs.getString("cod_cli"));
	                        	objL_obraBean.setStrPb_razon_social(objL_rs.getString("raz_soc"));
	                        	objL_obraBean.setStrPb_descObra(objL_rs.getString("desc_obra"));
	                        	objL_obraBean.setStrPb_numObra(objL_rs.getString("num_obra"));
	                        	objL_obraBean.setStrPb_usuarioBloqueo(objL_rs.getString("usuario"));
	                        	objL_obraBean.setStrPb_tipoBloqueo(objL_rs.getString("tipoBloqueo"));
	                        	objL_obraBean.setStrPb_motivoBloqueo(objL_rs.getString("motivo"));
	                        	objL_obraBean.setStrPb_fechaRegBloqueo(objL_rs.getString("fecha_registro"));
	                        	objL_obraBean.setStrPb_flgBloq("LM");//limite
	                        	
	                        	System.out.println(objL_obraBean.getObjPb_fechaBloqueo());
	                        	
	                        	if(objL_obraBean.getStrPb_tipoBloqueo().equalsIgnoreCase("BLOQUEO GENERAL")){
	                        		
	                        		if(objL_rs.getString("ctrlv_flg_bloqueo").equalsIgnoreCase("SI")){
	                        			
	                        			objL_obraBean.setStrPb_flgBloq("NO");
	                        		}
	                        		if(objL_rs.getString("ctrlv_flg_bloqueo").equalsIgnoreCase("NO")){
	                        			objL_obraBean.setStrPb_flgBloq("SI");
	                        		}
	                        		
	                        	}
	                        	                        	
	                        	aobjL_listaObras.add(objL_obraBean);
	                        }
	                }else{
	                    return null;
	                }
	        	
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			finally{
	        		close(conn, null, stmt);
	        }
		
			return aobjL_listaObras;
			
	}

	public ArrayList<ObraBean> consultaSoloBloqueosObra(
			ParametrosGenerales objA_parametros) {
		
		av_message = null;
        storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_BUSCAR_SOLO_BLOQUEO(?,?,?,?,?,?); end;";
		
		 ArrayList<ObraBean> aobjL_listaObras = new ArrayList<ObraBean>();
	        
	        try {
	        	
	        	    conn = dataSource.getConnection();
	                stmt = conn.prepareCall(storedProcedure);
	                            
	                stmt.registerOutParameter(1, OracleTypes.CURSOR);
	      			stmt.setString(2, objA_parametros.getStrPb_codigoCliente());
	      			stmt.setString(3, objA_parametros.getStrPb_numero_obra());
	      			
	      			
	      		  if ((objA_parametros.getObjPb_fechaInicio() != null) && (objA_parametros.getObjPb_fechaFin() != null)){
	      	        java.sql.Date fechaInicioSQL = new java.sql.Date(objA_parametros.getObjPb_fechaInicio().getTime());
	      	        java.sql.Date fechaFinSQL = new java.sql.Date(objA_parametros.getObjPb_fechaFin().getTime());
	      	        System.out.println(fechaInicioSQL);
	      	        System.out.println(fechaFinSQL);
	      	        stmt.setDate(4,fechaInicioSQL);	       
	      	        stmt.setDate(5,fechaFinSQL);
	              }      			
	      			
	      		    stmt.registerOutParameter(6, OracleTypes.VARCHAR);
	              
	                stmt.execute();
	                this.av_message = (String)stmt.getObject(6);
	                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
	                        rs = (ResultSet)stmt.getObject(1);
	                        while(rs.next()){
	                               
	                        	ObraBean objL_obraBean = new ObraBean();
	                        	objL_obraBean.setStrPb_codCli(rs.getString("cod_cli"));
	                        	objL_obraBean.setStrPb_razon_social(rs.getString("raz_soc"));
	                        	objL_obraBean.setStrPb_descObra(rs.getString("desc_obra"));
	                        	objL_obraBean.setStrPb_numObra(rs.getString("num_obra"));
	                        	objL_obraBean.setStrPb_usuarioBloqueo(rs.getString("usuario"));
	                        	objL_obraBean.setStrPb_tipoBloqueo(rs.getString("tipoBloqueo"));
	                        	objL_obraBean.setStrPb_motivoBloqueo(rs.getString("motivo"));
	                        	objL_obraBean.setStrPb_fechaRegBloqueo(rs.getString("fecha_registro"));
	                        	
	                        	
	                        	
	                        	aobjL_listaObras.add(objL_obraBean);
	                        }
	                }else{
	                    return null;
	                }
	        	
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			finally{
	        		close(conn, null, stmt);
	        }
			return aobjL_listaObras;
		
		
		
	}

	public ArrayList<ObraBean> consultaSoloDesbloqueo(ParametrosGenerales objA_parametros) {
		
		
		av_message = null;
        storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_BUSCAR_S_DESBLOQUEO(?,?,?,?,?,?); end;";
		
		 ArrayList<ObraBean> aobjL_listaObras = new ArrayList<ObraBean>();
	        
	        try {
	        	
	        	    conn = dataSource.getConnection();
	                stmt = conn.prepareCall(storedProcedure);
	                            
	                stmt.registerOutParameter(1, OracleTypes.CURSOR);
	      			stmt.setString(2, objA_parametros.getStrPb_codigoCliente());
	      			stmt.setString(3, objA_parametros.getStrPb_numero_obra());
	      			
	      			
	      		  if ((objA_parametros.getObjPb_fechaInicio() != null) && (objA_parametros.getObjPb_fechaFin() != null)){
	      	        java.sql.Date fechaInicioSQL = new java.sql.Date(objA_parametros.getObjPb_fechaInicio().getTime());
	      	        java.sql.Date fechaFinSQL = new java.sql.Date(objA_parametros.getObjPb_fechaFin().getTime());
	      	        System.out.println(fechaInicioSQL);
	      	        System.out.println(fechaFinSQL);
	      	        stmt.setDate(4,fechaInicioSQL);	       
	      	        stmt.setDate(5,fechaFinSQL);
	              }      			
	      			
	      		    stmt.registerOutParameter(6, OracleTypes.VARCHAR);
	              
	                stmt.execute();
	                this.av_message = (String)stmt.getObject(6);
	                
	                if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
	                        rs = (ResultSet)stmt.getObject(1);
	                        int pruebita= rs.getRow();
	                        while(rs.next()){
	                               
	                        	ObraBean objL_obraBean = new ObraBean();
	                        	objL_obraBean .setStrPb_codCli(rs.getString("cod_cli"));
	                        	objL_obraBean .setStrPb_razon_social(rs.getString("raz_soc"));
	                        	objL_obraBean .setStrPb_descObra(rs.getString("desc_obra"));
	                        	objL_obraBean .setStrPb_numObra(rs.getString("num_obra"));
	                        	objL_obraBean .setStrPb_usuarioBloqueo(rs.getString("usuario"));
	                        	objL_obraBean .setStrPb_tipoBloqueo(rs.getString("tipoBloqueo"));
	                        	objL_obraBean .setStrPb_motivoBloqueo(rs.getString("motivo"));
	                        	objL_obraBean .setStrPb_fechaRegBloqueo(rs.getString("fecha_registro"));
	                        	
	                        	
	                        	aobjL_listaObras.add(objL_obraBean );
	                        }
	                }else{
	                    return null;
	                }
	        	
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			finally{
	        		close(conn, null, stmt);
	        }
			return aobjL_listaObras;
		
		
	}
	
	
	
	public Connection getConexion() throws accesoDaoException
	  {					
			try {
				conn = dataSource.getConnection();	
			} catch (SQLException e) {	
				e.printStackTrace();
				throw new accesoDaoException("No puedo establecer conexion " , e );
			} 	 
			return conn;	    	
	 }

}
